package util

import (
	"gitee.com/goddesszz/gocommon/myutil"
	"github.com/google/uuid"
	"github.com/sirupsen/logrus"
	"reflect"
	"regexp"
	"strings"
)

// UuidLow 短小的uuid
func UuidLow() string {
	value, _ := uuid.NewRandom()
	v := value.String()
	return v[len(v)-12:]
}

func Uuid() string {
	value, _ := uuid.NewRandom()
	return value.String()
}

// 通用工具函数：将 对象 转换为非零值字段 map
func ObjToUpdateMap(obj any) map[string]any {
	if obj == nil {
		return nil
	}

	objValue := reflect.ValueOf(obj)

	if objValue.Kind() == reflect.Ptr {
		objValue = objValue.Elem()
	}

	objType := objValue.Type()

	//收集非零值
	updateMap := make(map[string]any)

	// 遍历结构体字段（按声明顺序）
	for i := 0; i < objValue.NumField(); i++ {
		fieldName := objType.Field(i).Name
		fieldValue := objValue.Field(i)
		//fmt.Println("fieldName = ", fieldName, ", value = ", fieldValue.Interface())

		if !fieldValue.IsZero() {
			updateMap[myutil.LowerFirst(fieldName)] = fieldValue.Interface()
		}
	}

	return updateMap
}

// Substring 截取字符串
// begin 开始位置（包含）
// end 结束位置（不包含）
// 如果 end 为 0，则返回从 begin 到字符串结束的子字符串
// 如果 end 为负数，则返回从 尾部截取
// 如果 begin=0,end=0,则返回空字符串
func Substring(str string, begin int, end int) string {
	if begin == end {
		return ""
	}

	if end == 0 {
		return str
	} else if end < 0 {
		return str[begin : len(str)+end]
	} else {
		return str[begin:end]
	}
}

// GetSequenceInt64 GetSequence 生成从 ... 到 tail 的整数切片（n个）
// tail 序列的尾巴
// n 序列的长度
func GetSequenceInt64(tail int64, n int) []int64 {
	if n <= 0 {
		return []int64{} // 边界条件：n 小于等于 0 时返回空切片
	}
	sequence := make([]int64, 0, n) // 预分配容量为 n 的切片，优化性能

	for i := tail - int64(n) + 1; i <= tail; i++ {
		sequence = append(sequence, i) // 从 1 循环到 n，依次添加到切片
	}
	return sequence
}

// 编译正则表达式（匹配${xxx}格式，提取xxx）
var placeholderRegex = regexp.MustCompile(`\$\{(.+?)\}`) // 非贪婪匹配${}内的文本

func GetPlaceholderNamed(str string) (string, bool) {
	matches := placeholderRegex.FindStringSubmatch(str)
	if len(matches) < 2 {
		logrus.Errorf("无效的ID格式: %s", str)
		return strings.TrimSpace(str), true
	}
	return strings.TrimSpace(matches[1]), true
}

func GetParamName(str string) (string, bool) {
	str = strings.TrimSpace(str)

	if strings.HasPrefix(str, "#") {
		str = strings.TrimPrefix(str, "#")
		return str, true
	}
	return str, false
}

// 正则匹配顶层 "password":"任意值" 格式
var passwordRegex = regexp.MustCompile(`"password":\s?"[^"]*"`)

// JsonStrErasePassword 从JSON字符串中擦除密码字段
func JsonStrErasePassword(jsonStr string) string {
	// 长度小于等于 "password" 长度，无需处理。为了提高效率，避免空字符串、"{}"空数据的正则匹配
	if len(jsonStr) <= len("'password':") {
		return jsonStr
	}

	return passwordRegex.ReplaceAllString(jsonStr, `"password":"******"`)
}
